package cn.com.guage.dtm.design.pattern.singleton;

public class 单例模式_双重检查锁定 {
    public static void main(String[] args) {
        DoubleCheckSingleton doubleCheckSingleton = DoubleCheckSingleton.getInstance();
        doubleCheckSingleton.showMessage();
    }
}
class DoubleCheckSingleton {
    // 1. volatile 防止指令重排序，确保实例初始化完整
    private static volatile DoubleCheckSingleton instance;

    /**
     * 私有构造函数：将类的构造函数声明为私有，阻止外部代码使用new关键字直接创建类的实例。这样，
     * 外界就无法随意创建多个实例，只能通过类自身提供的方法来获取实例。
     */
    private DoubleCheckSingleton() {
        // 防止反射攻击：可添加校验逻辑
        if (instance != null) {
            throw new IllegalStateException("Singleton instance already exists");
        }
    }

    public static DoubleCheckSingleton getInstance() {
        // 第一次检查：无实例时才加锁
        if (instance == null) {
            synchronized (DoubleCheckSingleton.class) { // 锁定类对象
                // 第二次检查：避免多个线程同时通过第一次检查
                if (instance == null) {
                    instance = new DoubleCheckSingleton(); // 1. 分配内存 2. 初始化对象 3. 引用赋值（可能被重排序）
                }
            }
        }
        return instance;
    }
    public void showMessage() {
        System.out.println("单例模式_双重检查锁定");
    }
}